# 导入所需的模块
import os   # 导入操作系统模块
import pickle   # 导入pickle模块，用于数据的序列化和反序列化

# 定义一个读取数据的函数
def read_data():
    try:
        with open('data01.dat', 'rb') as file:   # 打开文件data01.dat进行二进制读取
            workers = pickle.load(file)   # 使用pickle模块的load()函数将文件中的数据反序列化为对象
            return workers   # 返回读取到的数据
    except FileNotFoundError:   # 如果文件不存在，则返回一个空列表
        return []

# 定义一个保存数据的函数
def save_data(workers):
    with open('data01.dat', 'wb') as file:   # 打开文件data01.dat进行二进制写入
        pickle.dump(workers, file)   # 使用pickle模块的dump()函数将数据序列化为字节对象并写入文件中

# 定义一个输入员工信息的函数
def input_worker():
    workers = read_data()   # 调用read_data()函数读取数据
    n = len(workers)   # 获取当前员工数量
    m = int(input("请输入要增加的员工人数："))   # 输入要增加的员工人数
    for i in range(n, n + m):   # 遍历要添加的员工数量
        print(f"\n输入第{i + 1}个员工信息")
        jobNo = int(input("输入该员工员工号:"))   # 输入员工号
        while any(worker[0] == jobNo for worker in workers):   # 检查员工号是否重复
            jobNo = int(input("\t员工号重复，请重新输入："))
        name = input("请输入姓名：")   # 输入姓名
        sex = input("请输入性别：")   # 输入性别
        age = int(input("请输入年龄："))   # 输入年龄
        degree = input("请输入学历：")   # 输入学历
        position = input("请输入职务：")   # 输入职务
        salary = int(input("请输入工资："))   # 输入工资
        addr = input("请输入住址：")   # 输入住址
        tel = input("请输入电话：")   # 输入电话
        workers.append((jobNo, name, sex, age, degree, position, salary, addr, tel))   # 将员工信息添加到workers列表中
        os.system('cls')   # 清空控制台
        print("\n提示：已经完成一条记录的添加！\n\n")
    print("\n提示：成功录入所有员工信息！\n敲击回车返回上一级")
    input()   # 等待用户按回车键
    save_data(workers)   # 调用save_data()函数保存数据

# 定义一个更新员工信息的函数
def update_worker():
    while True:   # 循环显示更新员工信息的菜单
        os.system('cls')   # 清空控制台
        print("\n更新成员信息：")
        print("-----------------------------------------")
        print("             0. 返回主菜单               ")
        print("             1. 添加成员信息              ")
        print("             2. 删除成员信息              ")
        print("             3. 修改成员信息              ")
        print("-----------------------------------------")
        option = int(input("输入号码："))   # 输入选项
        os.system('cls')   # 清空控制台
        if option == 0:   # 如果选项为0，则返回上一级菜单
            return
        elif option == 1:   # 如果选项为1，则调用input_worker()函数添加员工信息
            input_worker()
        elif option == 2:   # 如果选项为2，则调用delete_worker()函数删除员工信息
            delete_worker()
        elif option == 3:   # 如果选项为3，则调用change_worker()函数修改员工信息
            change_worker()
        else:
            print("输入有误！")   # 如果选项不是0、1、2、3，则提示输入错误

# 定义一个显示所有员工信息的函数
def display_workers():
    workers = read_data()   # 调用read_data()函数读取数据
    print("\n目前贵公司所有员工信息:\n")
    print("\n员工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话\n")
    for worker in workers:   # 遍历每个员工的信息
        print(f"{worker[0]}\t{worker[1]}\t{worker[2]}\t{worker[3]}\t{worker[4]}\t{worker[5]}\t{worker[6]}\t{worker[7]}\t{worker[8]}")

# 定义一个删除员工的函数
def delete_worker():
    workers = read_data()   # 调用read_data()函数读取数据
    display_workers()   # 调用display_workers()函数显示员工信息
    jobNo = int(input("\n请输入要删除的员工的员工号:  "))   # 输入要删除的员工的员工号
    workers = [worker for worker in workers if worker[0] != jobNo]   # 使用列表推导式将不包含要删除员工的员工列表赋值给workers
    os.system('cls')   # 清空控制台
    save_data(workers)   # 调用save_data()函数保存数据
    display_workers()   # 调用display_workers()函数显示员工信息
    input("\n继续删除请按回车，退出删除并返回上一级请按Ctrl+C")   # 提示用户按回车键继续删除操作，或按Ctrl+C键退出

# 定义一个修改员工的函数
def change_worker():
    workers = read_data()   # 调用read_data()函数读取数据
    display_workers()   # 调用display_workers()函数显示员工信息
    jobNo = int(input("请输入要修改的员工的员工号:  "))   # 输入要修改的员工的员工号
    worker = next((worker for worker in workers if worker[0] == jobNo), None)   # 使用列表推导式找到员工号与输入相同的员工信息
    if worker:
        print(f"\n已找到该员工号员工，其记录为：\n")
        print(f"{worker[0]}\t{worker[1]}\t{worker[2]}\t{worker[3]}\t{worker[4]}\t{worker[5]}\t{worker[6]}\t{worker[7]}\t{worker[8]}")
        field = int(input("\n需要进行修改的选项\n1.员工号 2.姓名 3.性别 4.年龄 5.学历 6.职位 7.工资 8.住址 9.电话\n请输入你想修改的那一项序号:  "))
        new_worker = list(worker)   # 将要修改的员工信息转换为列表
        if field == 1:
            new_worker[0] = int(input("员工号改为: "))   # 修改员工号
        elif field == 2:
            new_worker[1] = input("姓名改为: ")   # 修改姓名
        elif field == 3:
            new_worker[2] = input("性别改为: ")   # 修改性别
        elif field == 4:
            new_worker[3] = int(input("年龄改为: "))   # 修改年龄
        elif field == 5:
            new_worker[4] = input("学历改为: ")   # 修改学历
        elif field == 6:
            new_worker[5] = input("职位改为: ")   # 修改职位
        elif field == 7:
            new_worker[6] = int(input("工资改为: "))   # 修改工资
        elif field == 8:
            new_worker[7] = input("住址改为: ")   # 修改住址
        elif field == 9:
            new_worker[8] = input("电话改为: ")   # 修改电话
        workers[workers.index(worker)] = tuple(new_worker)   # 将修改后的员工信息添加到workers列表中
        save_data(workers)   # 调用save_data()函数保存数据
        print("\n修改成功!")
    else:
        print("\n对不起，贵公司没有该员工!")
    input("\n继续修改请按回车，退出修改并返回上一级请按Ctrl+C")   # 提示用户按回车键继续修改操作，或按Ctrl+C键退出

# 定义一个查询员工的函数
def inquiry_worker():
    while True:
        os.system('cls')   # 清空控制台
        print("\t\t\t\t\t\tdesigned by LONG\n ")
        print("\n1.员工号  2.姓名  3.性别  4.年龄  5.学历  6.职位  7.工资  8.住址  9.电话  0.返回主菜单\n选择查询的依据：\n")
        option = int(input())   # 输入查询的选项
        if option == 0:   # 如果选项为0，则返回上一级菜单
            return
        elif option == 1:
            inquiry_by_field(0)   # 调用inquiry_by_field()函数按员工号查询员工信息
        elif option == 2:
            inquiry_by_field(1)   # 调用inquiry_by_field()函数按姓名查询员工信息
        elif option == 3:
            inquiry_by_field(2)   # 调用inquiry_by_field()函数按性别查询员工信息
        elif option == 4:
            inquiry_by_range(3)   # 调用inquiry_by_range()函数按年龄范围查询员工信息
        elif option == 5:
            inquiry_by_field(4)   # 调用inquiry_by_field()函数按学历查询员工信息
        elif option == 6:
            inquiry_by_field(5)   # 调用inquiry_by_field()函数按职位查询员工信息
        elif option == 7:
            inquiry_by_range(6)   # 调用inquiry_by_range()函数按工资范围查询员工信息
        elif option == 8:
            inquiry_by_field(7)   # 调用inquiry_by_field()函数按住址查询员工信息
        elif option == 9:
            inquiry_by_field(8)   # 调用inquiry_by_field()函数按电话查询员工信息
        else:
            print("输入有误！")   # 如果选项不是0-9之间的数字，则提示输入错误
        input("\n继续查询请按回车，返回主菜单请按Ctrl+C")   # 提示用户按回车键继续查询操作，或按Ctrl+C键返回主菜单

# 定义一个按指定字段查询员工信息的函数
def inquiry_by_field(field_index):
    workers = read_data()   # 调用read_data()函数读取数据
    query = input(f"\n请输入要查询的值:  ")   # 输入要查询的值
    filtered_workers = [worker for worker in workers if str(worker[field_index]) == query]   # 使用列表推导式找到符合查询条件的员工信息
    if filtered_workers:
        print(f"\n员工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话\n")
        for worker in filtered_workers:   # 遍历符合查询条件的员工信息并显示
            print(f"{worker[0]}\t{worker[1]}\t{worker[2]}\t{worker[3]}\t{worker[4]}\t{worker[5]}\t{worker[6]}\t{worker[7]}\t{worker[8]}")
    else:
        print("\n对不起，贵公司没有符合该要求的员工!")   # 如果没有符合查询条件的员工信息，则提示没有符合要求的员工

# 定义一个按指定范围查询员工信息的函数
def inquiry_by_range(field_index):
    workers = read_data()   # 调用read_data()函数读取数据
    min_val = int(input("\n请输入最小值:  "))   # 输入范围的最小值
    max_val = int(input("\n请输入最大值:  "))   # 输入范围的最大值
    filtered_workers = [worker for worker in workers if min_val <= worker[field_index] <= max_val]   # 使用列表推导式找到符合范围查询条件的员工信息
    if filtered_workers:
        print(f"\n员工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话\n")
        for worker in filtered_workers:   # 遍历符合范围查询条件的员工信息并显示
            print(f"{worker[0]}\t{worker[1]}\t{worker[2]}\t{worker[3]}\t{worker[4]}\t{worker[5]}\t{worker[6]}\t{worker[7]}\t{worker[8]}")
    else:
        print("\n对不起，贵公司没有符合该要求的员工!")   # 如果没有符合查询条件的员工信息，则提示没有符合要求的员工

# 定义一个排列员工信息的函数
def array_workers():
    workers = sorted(read_data(), key=lambda worker: worker[0])   # 调用read_data()函数读取数据，并根据员工号对员工信息进行排序
    save_data(workers)   # 调用save_data()函数保存数据
    display_workers()   # 调用display_workers()函数显示员工信息
    input("\n敲击回车返回主菜单\n")   # 等待用户按回车键返回主菜单

# 定义一个统计员工信息的函数
def statistics_workers():
    workers = read_data()   # 调用read_data()函数读取数据
    male_count = sum(1 for worker in workers if worker[2] == '男')   # 统计男性员工的数量
    female_count = sum(1 for worker in workers if worker[2] == '女')   # 统计女性员工的数量
    print(f"\n员工总人数：{len(workers)}\n男员工总人数：{male_count}\n女员工总人数：{female_count}\n")   # 打印统计结果
    input("\n敲击回车返回主菜单\n")   # 等待用户按回车键返回主菜单

# 定义一个输出员工信息的函数
def output_workers():
    display_workers()   # 调用display_workers()函数显示员工信息
    input("\n敲击回车返回主菜单\n")   # 等待用户按回车键返回主菜单

# 定义一个主菜单函数
def menu():
    while True:
        os.system('cls')   # 清空控制台
        print("\t企业员工信息管理系统")
        print("==================菜 单==================")
        print("             1.录入员工信息")
        print("             2.更新员工信息")
        print("             3.查询员工信息")
        print("             4.排列员工信息")
        print("             5.统计员工信息")
        print("             6.输出员工信息")
        print("             0. 退出")
        print("=========================================")
        option = int(input("输入你选择的序号："))   # 输入选项
        if option == 0:   # 如果选项为0，则退出程序
            print(" \n\t\t\t\n提示：退出系统!\n\t\t\t感谢您的使用\n\t\t\t再次敲击回车退出\n ")
            input()   # 等待用户按回车键退出
            break
        elif option == 1:   # 如果选项为1，则调用input_worker()函数添加员工信息
            input_worker()
        elif option == 2:   # 如果选项为2，则调用update_worker()函数更新员工信息
            update_worker()
        elif option == 3:   # 如果选项为3，则调用inquiry_worker()函数查询员工信息
            inquiry_worker()
        elif option == 4:   # 如果选项为4，则调用array_workers()函数排列员工信息
            array_workers()
        elif option == 5:   # 如果选项为5，则调用statistics_workers()函数统计员工信息
            statistics_workers()
        elif option == 6:   # 如果选项为6，则调用output_workers()函数输出员工信息
            output_workers()
        else:
            print("提示:输入错误！\n ")   # 如果选项不是0、1、2、3、4、5、6，则提示输入错误

# 如果该程序作为主程序被执行
if __name__ == "__main__":
    menu()   # 调用menu()函数显示主菜单，并根据用户选择执行相应的操作